﻿//using System;
//using System.Collections.ObjectModel;
//using System.Data.Entity;
//using System.Linq;
//using TeaLightV5.Foundation.BL;
//using TeaLightV5.Foundation.Sal.DataContracts;
//using TeaLightV5.Foundation.Sal.DataRequests;
//using TeaLightV5.Foundation.Sal.DataResponses;
//using TeaLightV5.Foundation.Sal.Interfaces;
//using TeaLightV5.Foundation.Server.DataSchema;
//using TeaLightV5.Foundation.Server.Utilities;

//namespace Conference.Server.Synchronization
//{
//    public abstract class SyncObject<TDto, TRdto, TQdto, TE, TKey>
//        where TDto : IServiceObject<TKey>, new()
//        where TRdto : DataResponse<TDto>, new()
//        where TQdto : DataRequest<TDto>
//        where TE : class, IEntity<TKey>, ISyncableEntity, new()
//    {
//        readonly string _entitySetName;

//        protected SyncObject(string entitySetName)
//        {
//            _entitySetName = entitySetName;
//        }

//        protected abstract DbContextBase CreateContext();

//        protected abstract TDto FromDatabase(TE item);

//        protected abstract void FromService(TDto item, TE entity);

//        public TRdto GetByModifiedDate(DateTime fromDate)
//        {
//            try
//            {
//                using (DbContextBase entities = CreateContext())
//                {

//                    Collection<TDto> list = new Collection<TDto>();

//                    DbSet<TE> set = entities.Set<TE>();

//                    foreach (var item in (from i in (set) where i.Modified >= fromDate select i))
//                    {
//                        list.Add(FromDatabase(item));
//                    }

//                    return new TRdto
//                        {
//                        Data = list,
//                        IsError = false,
//                        IsLast = true
//                    };
//                }
//            }
//            catch (Exception ex)
//            {
//                Exceptions.Handle(ex);
//                return new TRdto
//                    {
//                    IsError = true
//                };
//            }
//        }

//        public DeletedRowDataResponse<TKey> GetDeletedRowsByModifiedDate(DateTime fromDate)
//        {
//            try
//            {
//                using (DbContextBase entities = CreateContext())
//                {

//                    Collection<DeletedRowDataContract<TKey>> list = new Collection<DeletedRowDataContract<TKey>>();

//                    foreach (var item in (from i in (entities.Set<DeletedRow>())
//                                          where i.Modified >= fromDate
//                                          && i.TableName == _entitySetName
//                                          select i))
//                    {
//                        list.Add(new DeletedRowDataContract<TKey>()
//                            {
//                                Created = item.Created,
//                                CreatedBy = item.CreatedBy,
//                                Id = item.Id, 
//                                Modified = item.Modified, 
//                                ModifiedBy =  item.ModifiedBy, 
//                                RowId = item.RowId, 
//                                TableName = item.TableName
//                            });
//                    }

//                    return new DeletedRowDataResponse<TKey>
//                        {
//                        Data = list,
//                        IsError = false,
//                        IsLast = true
//                    };
//                }
//            }
//            catch (Exception ex)
//            {
//                Exceptions.Handle(ex);
//                return new DeletedRowDataResponse<TKey>
//                    {
//                    IsError = true
//                };
//            }
//        }

//        public void Update(TQdto data)
//        {
//            try
//            {
//                using (DbContextBase entities = CreateContext())
//                {
//                    DbSet<TE> set = entities.Set<TE>();

//                    foreach (TDto item in data.Data)
//                    {
//                        try
//                        {
//                            TE entity = (from i in set
//                                         where Equals(i.Id, item.Id)
//                                         select i).FirstOrDefault();

//                            if (entity == default(TE))
//                            {
//                                entity = new TE();
//                                FromService(item, entity);
//                                set.Add(entity);
//                            }
//                            else
//                            {
//                                FromService(item, entity);
//                            }
//                            entities.SaveChanges();
//                        }
//                        catch (Exception ex)
//                        {
//                            Exceptions.Handle(ex);
//                        }
//                    }
//                }
//            }
//            catch (Exception ex)
//            {
//                Exceptions.Handle(ex);
//            }
//        }

//        public void Delete(DeletedRowDataRequest<TKey> deleted)
//        {
//            try
//            {
//                using (DbContextBase entities = CreateContext())
//                {
//                    DbSet<TE> set = entities.Set<TE>();

//                    foreach (DeletedRowDataContract<TKey> key in deleted.Data)
//                    {
//                        try
//                        {
//                            TE entity = (set.Where(i => Equals(i.Id, key))).FirstOrDefault();
//                            if (entity != default(TE))
//                            {
//                                set.Remove(entity);
//                                entities.SaveChanges();
//                            }
//                        }
//                        catch (Exception ex)
//                        {
//                            Exceptions.Handle(ex);
//                        }

//                    }
//                }
//            }
//            catch (Exception ex)
//            {
//                Exceptions.Handle(ex);
//            }
//        }
//    }
//}
